package com.lin.zoo.dao;

import com.lin.zoo.dao.Interface.IDUser;
import com.lin.zoo.po.*;
import com.lin.zoo.util.DataBase;
import com.lin.zoo.po.Messege;

import java.sql.*;

public class UserDao implements IDUser {
    private Connection con;

    private PreparedStatement state;

    private static int signId;//用来存储注册用户的id

    protected static int loginId;//用户登录id

    public static int getLoginId() {
        return loginId;
    }
    @Override
    //登录方法
    public Messege login(Users user) {
        try {
            con = DataBase.getCon();
            //获取连接，通过DateBase处理好的通道，连接至mysql数据。
            String sql = "SELECT * FROM user WHERE name = ?";
            //设定mysql语句
            state = con.prepareStatement(sql);
            //执行sql语句
            state.setString(1, user.getName());
            //表中name与用户输入的名字相对应
            ResultSet rs = state.executeQuery();
            if(rs.next()){
                if(user.getPassword().equals(rs.getString("password"))){
                    //如果用户名相等的数据存在，再判断其密码是否正确
                    user.setId(rs.getInt("id"));
                    user.setName(rs.getString("name"));
                    loginId =rs.getInt("id");//设置loginId，用于其他功能的用户id获取
                    //将各参数返回
                    return new Messege("登录成功",user);
                }
                return new Messege("密码错误",null);
            }
        }

        //捕捉异常
        catch(ClassNotFoundException | SQLException e){
            System.out.println("数据库数据调用失败" + this.getClass().getName());
        }finally{
            try{
                DataBase.close(state, con);
            } catch(SQLException e){
                System.out.println("数据库数据调用失败" + this.getClass().getName());
            }
        }
        return new Messege("该用户不存在",null);
    }
    @Override
    public Messege sign(String username,String password){
        Users user =new Users();
        try {
            con = DataBase.getCon();
            //获取连接
            String sql = "INSERT INTO user (name,password) VALUES (?,?)";//仅将用户的名字与密码添加，个人信息由signvisitor实现
            //插入数据的sql语句
            state = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            //执行sql插入语句
            state.setString(1,username);//name
            state.setString(2,password);//password
            state.executeUpdate();//*
                try (ResultSet rs = state.getGeneratedKeys()) {
                    if (rs.next()) {
                        int id = rs.getInt(1);
                        user.setId(id);
                        signId =id;
                        user.setName(username);
                        user.setPassword(password);//添加信息，用于message的返回
                    }
                }
                return new Messege("注册成功",user);
        }
        //捕捉异常
        catch(ClassNotFoundException | SQLException e){
            System.out.println("数据库数据调用失败" + this.getClass().getName());
        }finally{
            try{
                DataBase.close(state, con);
            } catch(SQLException e){
                System.out.println("数据库数据调用失败" + this.getClass().getName());
            }
        }
        return new Messege("注册失败",null);
    }
    @Override
    public Messege disuser(Users user) {
        try {
            con = DataBase.getCon();
            //获取连接，通过DateBase处理好的通道，连接至mysql数据。
            String sql = "SELECT * FROM visitor WHERE user_id = ?";//首先检查visitor表中是否有这个用户
            //设定mysql语句
            state = con.prepareStatement(sql);
            //执行sql语句
            state.setInt(1, user.getId());
            ResultSet rs = state.executeQuery();
            if(rs.next()){
            if(user.getId()==rs.getInt("user_id")){
                Visitor visitor=new Visitor();
                visitor.setId(rs.getInt("id"));
                visitor.setCard(rs.getString("card"));
                visitor.setNumber(rs.getString("number"));
                visitor.setUserId(rs.getInt("user_id"));//添加信息，用于message的返回
                return new Messege("游客身份登录",visitor);//用户存在识别为游客用户，并返回用户信息打印到控制台
                }
            }
            else {
                String sql1 = "SELECT * FROM master WHERE user_id = ?";//查找master表，查看是否存在此用户
                //设定mysql语句
                state = con.prepareStatement(sql1);
                //执行sql语句
                state.setInt(1,user.getId());
                //首先获取表中的Id
                ResultSet rs1 = state.executeQuery();
                if(rs1.next()){
                    if(user.getId()==rs1.getInt("user_id")){
                    Master master=new Master();
                    master.setId(rs1.getInt("id"));
                    master.setCard(rs1.getString("card"));
                    master.setNumber(rs1.getString("number"));
                    master.setUserId(rs1.getInt("user_id"));//添加信息，用于message的返回
                    return new Messege("园长身份登录",master);//找到用户，识别为园长账号，并返回master信息
                    }
                }
                else{
                    String sql2 = "SELECT * FROM feeder WHERE user_id = ?";//查找feeder是否存在用户
                    //设定mysql语句
                    state = con.prepareStatement(sql2);
                    //执行sql语句
                    state.setInt(1,user.getId());
                    //首先获取表中的Id
                    ResultSet rs2 = state.executeQuery();
                    if(rs2.next()){
                    if(user.getId()==rs2.getInt("user_id")){
                        Feeder feeder=new Feeder();
                        feeder.setId(rs2.getInt("id"));
                        feeder.setCard(rs2.getString("card"));
                        feeder.setNumber(rs2.getString("number"));
                        feeder.setUserId(rs2.getInt("user_id"));//添加信息，用于message的返回

                        return new Messege("饲养员身份登录",feeder);//识别为饲养员登录
                        }
                    }
                    else{
                        return new Messege("无法确认身份",user);//判断为数据库出错，此账号没有连接到任何身份
                    }
                }
            }
        }
        //捕捉异常
        catch(ClassNotFoundException | SQLException e){
            System.out.println("数据库数据调用失败" + this.getClass().getName());
        }finally{
            try{
                DataBase.close(state, con);
            } catch(SQLException e){
                System.out.println("连接关闭失败" + this.getClass().getName());
            }
        }
        return new Messege("该用户不存在",null);//判断用户不存在，返回null
    }
    @Override
   //修改用户个人信息
    public Messege reinformation(String card,String number){

        try{
            con = DataBase.getCon();
            //获取连接，通过DateBase处理好的通道，连接至mysql数据。
            String sql = "update visitor set card=?,number=? where user_id=?";//更新用户的身份证号与手机号码
            //设定mysql语句
            state = con.prepareStatement(sql);
            //执行sql语句
            state.setString(1,card);
            state.setString(2,number);
            state.setInt(3, loginId);//由登录页面处获取的登录用户id
            int rs=state.executeUpdate();
            if(rs>0){
                return new Messege("修改成功", loginId);
            }
        }
        catch(ClassNotFoundException | SQLException e){
            System.out.println("数据库数据调用失败" + this.getClass().getName());
        }finally{
            try{
                DataBase.close(state, con);
            } catch(SQLException e){
                System.out.println("连接关闭失败" + this.getClass().getName());
            }
        }
        return new Messege("数据写入失败",null);
    }
    @Override
    public Messege signvisitor(String card,String number){
        try {
            con = DataBase.getCon();
            //获取连接
            String sql = "INSERT INTO visitor (card,number,user_id) VALUES (?,?,?)";//添加注册新用户的个人信息
            //插入数据的sql语句
            state = con.prepareStatement(sql, state.RETURN_GENERATED_KEYS);
            //执行sql插入语句
            {
                state.setObject(1,card);//card
                state.setObject(2,number);//number
                state.setObject(3, signId);//识别注册账号的新的id
                state.executeUpdate();

                Visitor visitor =new Visitor();
                visitor.setUserId(signId);
                visitor.setNumber(number);
                visitor.setCard(card);//添加信息，用于message的返回
                try (ResultSet rs = state.getGeneratedKeys()) {
                    if (rs.next()) {
                        int id = rs.getInt(1);
                        visitor.setId(id);
                    }
                }
                return new Messege("创建成功",visitor);
            }
        }
        //捕捉异常
        catch(ClassNotFoundException | SQLException e){
            System.out.println("数据库数据调用失败" + this.getClass().getName());
        }finally{
            try{
                DataBase.close(state, con);
            } catch(SQLException e){
                System.out.println("连接关闭失败" + this.getClass().getName());
            }
        }
        return new Messege("创建失败",null);
    }
}


